/**
 * 1004. 最大连续1的个数 III
 * https://leetcode-cn.com/problems/max-consecutive-ones-iii/
 */
public class Solutions_1004 {
    public static void main(String[] args) {
//        int[] A = {1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0};
//        int K = 2;  // output: 6

        int[] A = {0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1};
        int K = 3;  // output: 10

//        int[] A = {0, 0, 0, 0, 0, 0};
//        int K = 0;  // output: 0

//        int[] A = {0, 0, 0, 0, 0, 0};
//        int K = 3;  // output: 3

        int result = longestOnes(A, K);
        System.out.println(result);
    }

    /**
     * 解法二：滑动窗口优化（3ms）
     * 遍历过程中，滑动窗口的长度相应地变化（但其长度只会越来越大，而不会越来越小）
     */
    public static int longestOnes(int[] A, int K) {
        int left = 0, right = 0, len = A.length;
        int maxCnt = 0;
        while (right < len) {
            if (A[right ++] == 0) {
                maxCnt ++;
            }
            if (maxCnt > K) {
                if (A[left ++] == 0) {
                    maxCnt --;
                }
            }
        }
        return right - left;
    }

    /**
     * 解法一：滑动窗口（4ms）
     * 维护一个区间索引为 [left, right]　的滑动窗口，保证窗口内元素 0 的元素不超过 K 个
     */
    public static int longestOnes2(int[] A, int K) {
        if (A == null) {
            return 0;
        }
        int len = A.length;
        if (K == len) {
            // 可以全部替换
            return len;
        }
        int res = 0;
        int left = 0, right = 0;

        while (right < len && left < len) {
            K -= A[right] == 0 ? 1 : 0;
            while (K < 0) {
                // 左指针右移
                K += A[left ++] == 0 ? 1 : 0;
            }
            int curLen = right - left + 1;
            res = Math.max(res, curLen);
            right ++;
        }
        return res;
    }
}
